package edu.zut.cs.software.example.util.JWT;

import java.util.Date;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jws;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

public class JwtHelper {
	
	/**
	 * 生成token
	 */
	public static String createToken(String userId) {
		/*
		 * header 头部分已经被JJwt封装 非必要无需处理
		 */
		
		/*
		 * 准备 签名算法 + 签名密匙
		 * 		signatureAlgorithm指定了签名算法
		 * 		secretKey指定了签名密匙 密匙可以是多种数据类型
		 */
		SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
		String secretKey  = "i_am_the_SecretKey";
		
		/*
		 * 准备 签发时间+过期时间
		 *	 	Date nowTime 是签发时间
		 * 		Date expTime  是过期时间
		 */
		long MillisOfTimeNow = System.currentTimeMillis();//获取此刻时间（毫秒）
		Date nowTime = new Date(MillisOfTimeNow);
		long MillisOfTimeEffective = 1000*60;// 有效时长（毫秒）： 1min
		Date expTime=new Date(MillisOfTimeNow+MillisOfTimeEffective);
		
		
		/*
		 * 设置注入生成token的信息
		 */
		JwtBuilder builder=
			Jwts.builder()
				.setId(userId)//是JWT的唯一标识，根据业务需要，这个可以设置为一个不重复的值，主要用来作为一次性token,从而回避重放攻击。		
				.setSubject("主体")            
				.setIssuedAt(nowTime) //设置签发时间
			.signWith(signatureAlgorithm,secretKey);//Signature 签名：算法+密匙
//				.setExpiration(expTime);//签发后设置过期时间
		
		/*
		 * 	压缩生成Token
		 */
		String Token = builder.compact();
		
		return Token;

	}

	/**
	 * 解析并验证Token方法函数
	 * @param token
	 */
	public static void parseToken(String token) {
		
		System.out.println("Begin***************验证token****************");
		
		Jws<Claims> JwtParseClaims=Jwts.parser()
		.setSigningKey("i_am_the_SecretKey")
		.parseClaimsJws(token);
	
		System.out.println(JwtParseClaims);
		System.out.println(JwtParseClaims.getBody());
		System.out.println(JwtParseClaims.getBody().getExpiration());
		
		System.out.println("End***************验证token****************");
	}
	
	/**
	 * 解析并获取Id
	 * @param token
	 * @return
	 */
	public static String parseAndget(String token) {
		Jws<Claims> JwtParseClaims=Jwts.parser()
				.setSigningKey("i_am_the_SecretKey")
				.parseClaimsJws(token);
		
		return JwtParseClaims.getBody().getId();	
		
	}
	
	
}
